; PMODE 1 LIBRARY BY SHELDON MACDONALD
; JUNE 25,2021-Aug 7,2021
; VR 2.02
;
; 
; ****************************************************************************************************
; * putbytes1(screen0-3,x1,y1,SIZEX,SIZEY,transparency,u)
; ****************************************************************************************************
FUNCTION	PUTBYTES1	SCREEN,X1,Y1,SX,SY,TRANS,U
REM	; putbytes1(screen0-3,x1,y1,sizex,sizey,transparency,addr pointer)
REM	; pmode 1 (0-31 x 0-63 placement)
DEF	SCREEN	BYTE
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	SX	BYTE
DEF	SY	BYTE
DEF	TRANS	BYTE	;transparency
DEF	U	STRING
; put on the screen
X1	FCB	0
Y1	FCB	0
SX	FCB	0
SY	FCB	0
CNTX	FCB	0
CNTY	FCB	0
TRANS	FCB	0
DOT1	FCB	0
DOT2	FCB	0
DOT3	FCB	0
DOT4	FCB	0
SCREEN	FCB	0	; what screen
SAVEU	FCB	0,0	; sprite addr
SCRNTBL	FDB	3584,5632,7680,9728
PUTBYTES1	STU	SAVEU
	LDX	#SCRNTBL
	LDB	SCREEN
	LDA	#2
	MUL
	LDX	B,X	;ok now the screen is ready
	LDA	Y1
	LDB	#32
	MUL
	LEAX	D,X
	LDB	X1
	ABX
; ready on x
	LDA	TRANS
	LBEQ	NORMAL
; needs to preserve bg
	CLR	CNTX
	CLR	CNTY
LOOP2	LDA	,U
	ANDA	#192
	BNE	CONT1
	LDA	,X
	ANDA	#192
CONT1	STA	DOT1
; next dot
	LDA	,U
	ANDA	#48
	BNE	CONT2
	LDA	,X
	ANDA	#48
CONT2	STA	DOT2
; next dot
	LDA	,U
	ANDA	#12
	BNE	CONT3
	LDA	,X
	ANDA	#12
CONT3	STA	DOT3
; next dot
	LDA	,U+
	ANDA	#3
	BNE	CONT4
	LDA	,X
	ANDA	#3	;no need to save dot 4
CONT4	ADDA	DOT3
	ADDA	DOT2
	ADDA	DOT1
	STA	,X+
	INC	CNTX
	LDA	CNTX
	CMPA	SX
	BLO	LOOP2
	LDB	#32
	SUBB	CNTX
	ABX
	INC	CNTY
	CLR	CNTX
	LDA	CNTY
	CMPA	SY
	BLO	LOOP2
	RTS
NORMAL	CLR	CNTX
	CLR	CNTY
LOOP1	LDA	,U+
	STA	,X+
	INC	CNTX
	LDA	CNTX
	CMPA	SX
	BLO	LOOP1
	LDB	#32
	SUBB	CNTX
	ABX
	INC	CNTY
	CLR	CNTX
	LDA	CNTY
	CMPA	SY
	BLO	LOOP1
	RTS
ENDFUNCTION
; 
; 
; ****************************************************************************************************
; * put1(screen0-3,x1,y1,transparency,address)
; ****************************************************************************************************
FUNCTION	PUT1	SCREEN,X1,Y1,TRANS,U
REM	; put1(screen0-3,x1,y1,transparency,addr pointer)
REM	; pmode 1 (127x63)
DEF	SCREEN	BYTE
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	TRANS	BYTE
DEF	U	STRING
; put on the screen
X1	FCB	0
Y1	FCB	0
X2	FCB	0
Y2	FCB	0
CNTX	FCB	0
TRANS	FCB	0
SCREEN	FCB	0	;what screen
SAVEU	FCB	0,0	;start draw addr
SCRNTBL	FDB	3584,5632,7680,9728
DOTMSK	FCB	63,207,243,252
DOTMSK2	FCB	192,48,12,3
DOTCOL	FCB	0,85,170,255
XP1	FCB	0	; 0-127
YP1	FCB	0	; 0-95
COL1	FCB	0	; dot color 0-3
DOTST	FCB	0	; dot store
DOTM	FCB	0	; dot masked color
PUT1	STU	SAVEU
	LDA	0,U
	STA	X2
	LDA	1,U
	ADDA	Y1
	STA	Y2	;sizes saved
	LEAU	2,U	;u is ready for data
; lets process dots
LOOP0	CLR	CNTX	;x counter
LOOP	LDA	,U+	;got first pixel
	STA	COL1	;color to set
	LDA	X1
	ADDA	CNTX
	STA	XP1	;plus x
	LDA	Y1
	STA	YP1
	STU	SAVEU
	JSR	PSET	;draw dot
	LDU	SAVEU
	INC	CNTX
	LDA	CNTX
	CMPA	X2
	BLS	LOOP	;may need adj
	INC	Y1
	LDA	Y1
	CMPA	Y2
	BHI	DONE
	BRA	LOOP0
DONE	RTS
;
PSET	LDA	COL1
	BNE	NOTRANS
	LDA	TRANS
	LBNE	DONE2
NOTRANS	LDB	SCREEN
	LDX	#SCRNTBL
	LDY	#DOTMSK2
	LDU	#DOTCOL
	LSLB	; SCRN #*2
	ABX
	LDX	,X
; x index is at start of screen
	LDA	YP1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	XP1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	XP1
	LSRB
	LSRB
	ABX	;ok we are ready to draw (again, result is always 8 bits LCB)
; mask color
	LDB	COL1
	LDA	B,U
	LDB	DOTST
	ANDA	B,Y
	STA	DOTM	;dot saved
; grab original
	LDU	#DOTMSK	; 1 byte smaller/1 CYCLE FASTER
	LDA	,X
	ANDA	B,U
	ADDA	DOTM
	STA	,X
DONE2	RTS
ENDFUNCTION
;
; ****************************************************************************************************
; * get1(screen0-3,x1,y1,x2,y2,address)
; ****************************************************************************************************
FUNCTION	GET1	SCREEN,X1,Y1,X2,Y2,U
REM	; get1(screen0-3,x1,y1,x2,y2,addr pointer)
REM	; pmode 1 (127x63)
DEF	SCREEN	BYTE
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	X2	BYTE
DEF	Y2	BYTE
DEF	U	STRING
; get on the screen
X1	FCB	0
Y1	FCB	0
X2	FCB	0
Y2	FCB	0
CNTX	FCB	0
SCREEN	FCB	0	;what screen
SCRNTBL	FDB	3584,5632,7680,9728
XP1	FCB	0	; 0-127
YP1	FCB	0	; 0-95
DOTST	FCB	0	; dot store
GET1	LDA	X2
	SUBA	X1
	STA	0,U
	STA	X2
	LDA	Y2
	SUBA	Y1
	STA	1,U
	LEAU	2,U
; lets process dots
LOOP0	CLR	CNTX	;x counter
LOOP	LDA	X1
	ADDA	CNTX
	STA	XP1	;plus x
	LDA	Y1
	STA	YP1
	JSR	POINT	;draw dot
	STB	,U+
	INC	CNTX
	LDA	CNTX
	CMPA	X2
	BLS	LOOP	;may need adj
	INC	Y1
	LDA	Y1
	CMPA	Y2
	BHI	DONE
	BRA	LOOP0
DONE	RTS
POINT	LDA	SCREEN
	LDX	#SCRNTBL
	LDB	#2
	MUL
	LEAX	B,X
	LDX	,X
; x index is at start of screen
	LDA	YP1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	XP1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	XP1
	LSRB
	LSRB
	LEAX	B,X	;ok we are ready to draw
	LDA	DOTST
	CMPA	#3
	BEQ	HOWB0
	CMPA	#2
	BEQ	HOWB1
	CMPA	#1
	BEQ	HOWB2
; its 4th dot
	LDB	,X
	LSRB
	LSRB
	LSRB
	LSRB
	LSRB
	LSRB
	ANDB	#3
	RTS
HOWB0	LDB	,X
	ANDB	#3
	RTS
HOWB1	LDB	,X
	LSRB
	LSRB
	ANDB	#3
	RTS
HOWB2	LDB	,X
	LSRB
	LSRB
	LSRB
	LSRB
	ANDB	#3
	RTS
ENDFUNCTION
;
;
; *************************************************************************************************************************
; * sync pmode 1     128x64x4 colors
; * sync1(buff,colorset) 0-3    up to 4 screens    colorset 160,168,248 valid
; *************************************************************************************************************************
FUNCTION	SYNC1	BUFFER,COLSET
REM	; sync1( screen,colorset ) mem usage 3584-11776 max usage
REM	; colorset can be 160,168, or 248 only. ( pmode 1) each screen is 2048 bytes 128x64x4
DEF	BUFFER	BYTE
DEF	COLSET	BYTE
BUFFER	FCB	0
COLSET	FCB	0
; if its 0 then its 3584
; if its 1 then its 5632
; if its 2 then its 7680
; if its 3 then its 9728
; 3584 start of view to 5631    2k screen 4 color
; res =128x64 _2048 bytes
SYNC1	CLRA
SYNCS	LDA	$FF03
	BPL	SYNCS
	LDA	$FF02
	LDA	BUFFER
	BEQ	SCREEN0
	CMPA	#1
	BEQ	SCREEN1
	CMPA	#2
	LBEQ	SCREEN2
	CMPA	#3
	LBEQ	SCREEN3
	RTS	;bad command
SCREEN0	CLRA	; set ram start 7
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	5,X
	STA	6,X
	STA	8,X
	STA	10,X
	STA	12,X
; vdg pattern
	LDX	#65472
	STA	,X
	STA	3,X
	STA	4,X
	LBRA	CHANGE
SCREEN1	CLRA	; set ram start 11
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	4,X
	STA	7,X
	STA	8,X
	STA	10,X
	STA	12,X
; vdg pattern
	LDX	#65472
	STA	,X
	STA	3,X
	STA	4,X
	LBRA	CHANGE
SCREEN2	CLRA	; set ram start 15
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	5,X
	STA	7,X
	STA	8,X
	STA	10,X
	STA	12,X
; vdg pattern
	LDX	#65472
	STA	,X
	STA	3,X
	STA	4,X
	LBRA	CHANGE
SCREEN3	CLRA	; set ram start 19
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	4,X
	STA	6,X
	STA	9,X
	STA	10,X
	STA	12,X
; vdg pattern
	LDX	#65472
	STA	,X
	STA	3,X
	STA	4,X
CHANGE	LDA	COLSET
	STA	$FF22
FINISH	RTS
ENDFUNCTION
;
; ***********************************************************************************************************************
; * cls1( screen, color)
; ***********************************************************************************************************************
FUNCTION	CLS1	BUFFER,COLOR
REM	; cls1( screen, color)  screen 0-3. color is 0-3
REM	; pmode1  128x64x4
DEF	BUFFER	BYTE
DEF	COLOR	BYTE
COLOR	FCB	0,0
BUFFER	FCB	0
CLSEND	FCB	0,0
CLSSTART	FCB	0,0
CLTABLE	FCB	0,85,170,255
CLS1	LDA	BUFFER
	BEQ	CLS0
	CMPA	#1
	BEQ	CLS11
	CMPA	#2
	BEQ	CLS2
	CMPA	#3
	BEQ	CLS3
	RTS	;bad command
CLS0	LDX	#3584
	LDD	#5632
	BRA	STARTCLS
CLS11	LDX	#5632
	LDD	#7680
	BRA	STARTCLS
CLS2	LDX	#7680
	LDD	#9728
	BRA	STARTCLS
CLS3	LDX	#9728
	LDD	#11776
STARTCLS	STD	CLSEND
	LDA	COLOR
	LDY	#CLTABLE
	LDB	A,Y
	STB	COLOR
	LDA	COLOR
	STD	COLOR
	LDU	CLSEND
	STX	CLSSTART
	LDX	COLOR
	LDY	COLOR
CLSPM3_1	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	D
	CMPU	CLSSTART
	BHI	CLSPM3_1
	RTS
ENDFUNCTION
;
; *************************************************************************************************************************
; * PCOPY1(source,dest,erase)
; *************************************************************************************************************************
FUNCTION	PCOPY1	SOURCE,DEST,ERASE
REM	; pcopy1( source screen, dest screen, erase)
REM	; pmode 1
DEF	ERASE	BYTE
DEF	SOURCE	BYTE
DEF	DEST	BYTE
DISP	FDB	3584,5632,7680,9728
SOURCE	FCB	0
DEST	FCB	0
ERASE	FCB	0
TARGET	FCB	0,0
PCOPY1	LDA	SOURCE
	LDX	#DISP
	LDB	#2
	MUL
	LEAX	D,X
	LDX	,X
	STX	TARGET
	LDD	TARGET
	ADDD	#2048
	STA	TARGET
; source ready
	LDA	DEST
	LDY	#DISP
	LDB	#2
	MUL
	LEAY	D,Y
	LDY	,Y
; destination ready
	LDA	ERASE
	LBNE	LP2
LP1	LDD	0,X
	STD	0,Y
	LDD	2,X
	STD	2,Y
	LDD	4,X
	STD	4,Y
	LDD	6,X
	STD	6,Y
	LDD	8,X
	STD	8,Y
	LDD	10,X
	STD	10,Y
	LDD	12,X
	STD	12,Y
	LDD	14,X
	STD	14,Y
	LDD	16,X
	STD	16,Y
	LDD	18,X
	STD	18,Y
	LDD	20,X
	STD	20,Y
	LDD	22,X
	STD	22,Y
	LDD	24,X
	STD	24,Y
	LDD	26,X
	STD	26,Y
	LDD	28,X
	STD	28,Y
	LDD	30,X
	STD	30,Y
	LEAX	32,X
	LEAY	32,Y
	CMPX	TARGET
	LBLO	LP1
	RTS
LP2	LDD	0,X
	CLR	0,X
	CLR	1,X
	STD	0,Y
	LDD	2,X
	CLR	2,X
	CLR	3,X
	STD	2,Y
	LDD	4,X
	CLR	4,X
	CLR	5,X
	STD	4,Y
	LDD	6,X
	CLR	6,X
	CLR	7,X
	STD	6,Y
	LDD	8,X
	CLR	8,X
	CLR	9,X
	STD	8,Y
	LDD	10,X
	CLR	10,X
	CLR	11,X
	STD	10,Y
	LDD	12,X
	CLR	12,X
	CLR	13,X
	STD	12,Y
	LDD	14,X
	CLR	14,X
	CLR	15,X
	STD	14,Y
	LDD	16,X
	CLR	16,X
	CLR	17,X
	STD	16,Y
	LDD	18,X
	CLR	18,X
	CLR	19,X
	STD	18,Y
	LDD	20,X
	CLR	20,X
	CLR	21,X
	STD	20,Y
	LDD	22,X
	CLR	22,X
	CLR	23,X
	STD	22,Y
	LDD	24,X
	CLR	24,X
	CLR	25,X
	STD	24,Y
	LDD	26,X
	CLR	26,X
	CLR	27,X
	STD	26,Y
	LDD	28,X
	CLR	28,X
	CLR	29,X
	STD	28,Y
	LDD	30,X
	CLR	30,X
	CLR	31,X
	STD	30,Y
	LEAX	32,X
	LEAY	32,Y
	CMPX	TARGET
	LBLO	LP2
	RTS
ENDFUNCTION
;
;
; *************************************************************************************************************************
; * MCOPY1(source,dest)
; *************************************************************************************************************************
FUNCTION	MCOPY1	SOURCE,DEST
REM	; mcopy1( source screen, dest screen) merge but skip black space
REM	; pmode 1
DEF	SOURCE	BYTE
DEF	DEST	BYTE
SOURCE	FCB	0
DEST	FCB	0
DISP	FDB	3584,5632,7680,9728
TARGET	FCB	0,0
DOT1	FCB	0
DOT2	FCB	0
DOT3	FCB	0
DOT4	FCB	0
MCOPY1	LDA	SOURCE
	LDX	#DISP
	LDB	#2
	MUL
	LEAX	D,X
	LDX	,X
	STX	TARGET
	LDD	TARGET
	ADDD	#2048
	STA	TARGET
; source ready
	LDA	DEST
	LDY	#DISP
	LDB	#2
	MUL
	LEAY	D,Y
	LDY	,Y
; destination ready
; x source
; y destination
LOOP2	LDA	,X
	ANDA	#192
	BNE	CONT1
	LDA	,Y
	ANDA	#192
CONT1	STA	DOT1
; next dot
	LDA	,X
	ANDA	#48
	BNE	CONT2
	LDA	,Y
	ANDA	#48
CONT2	STA	DOT2
; next dot
	LDA	,X
	ANDA	#12
	BNE	CONT3
	LDA	,Y
	ANDA	#12
CONT3	STA	DOT3
; next dot
	LDA	,X+
	ANDA	#3
	BNE	CONT4
	LDA	,Y
	ANDA	#3	; dont need to save dot 4
CONT4	ADDA	DOT3
	ADDA	DOT2
	ADDA	DOT1
	STA	,Y+
	CMPX	TARGET
	BLO	LOOP2
	RTS
ENDFUNCTION
;
; *************************************************************************************************************************
; *  print1(screen,transparency,x,y,start,len,text$)
; *************************************************************************************************************************
FUNCTION	PRINT1	SCREEN,TRANS,XPOS,YPOS,START1,LEN1,U
REM	; print1(screen0-3,transparency,xpos,ypos,start,length,text$)
REM	; res 128x64 pmode 1
DEF	SCREEN	BYTE
DEF	TRANS	BYTE
DEF	XPOS	BYTE
DEF	YPOS	BYTE
DEF	START1	BYTE
DEF	LEN1	BYTE
DEF	U	STRING
XPOS	FCB	0
YPOS	FCB	0
TRANS	FCB	0
DOTS	FCB	0,0,0,0,0,0,0,0	;8 dots 2bytes
DOTSTR	FCB	0
STRINGLOC	FCB	0,0	;save u
CHRSTART	FCB	0,0	;save x
START1	FCB	0
LEN1	FCB	0
SCREEN	FCB	0
TEMP	FCB	0
SCREENTBL	FDB	3584,5632,7680,9728
; default white only
; 0=black
; 2=blue
; 1=red
; 3=white
#NOMOVE
ASCII	FCB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	; blank space
	FCB	0,3,0,0,0,3,0,0,0,0,0,0,0,3,0,0	;!
	FCB	3,0,3,0,3,0,3,0,0,0,0,0,0,0,0,0	;"
	FCB	3,2,3,0,2,3,2,0,3,2,3,0,0,0,0,0	;#
	FCB	0,2,3,0,3,2,0,0,0,2,3,0,3,2,0,0	;$
	FCB	2,0,3,0,0,3,0,0,0,3,0,0,3,0,2,0	;%
	FCB	0,3,2,0,3,3,3,0,3,2,3,0,0,3,3,0	;&
	FCB	0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0	;*
	FCB	0,3,0,0,3,0,0,0,3,0,0,0,0,3,0,0	;(
	FCB	0,3,0,0,0,0,3,0,0,0,3,0,0,3,0,0	;)
	FCB	3,0,3,0,0,3,0,0,3,0,3,0,0,0,0,0	;*
	FCB	0,3,0,0,3,3,3,0,0,3,0,0,0,0,0,0	;+
	FCB	0,0,0,0,0,0,0,0,0,3,0,0,3,0,0,0	;,
	FCB	0,0,0,0,3,3,3,0,0,0,0,0,0,0,0,0	;-
	FCB	0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0	;.
	FCB	0,0,3,0,0,3,0,0,0,3,0,0,3,0,0,0	;/
	FCB	3,3,3,0,3,0,3,0,3,0,3,0,3,3,3,0	;0
	FCB	0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0	;1
	FCB	3,3,3,0,0,0,3,0,3,3,0,0,3,3,3,0	;2
	FCB	3,3,3,0,0,0,3,0,2,2,3,0,3,3,3,0	;3
	FCB	3,0,3,0,3,0,3,0,3,3,3,0,0,0,3,0	;4
	FCB	3,3,3,0,3,0,0,0,0,3,3,0,3,3,3,0	;5
	FCB	3,0,0,0,3,0,0,0,3,3,3,0,3,3,3,0	;6
	FCB	3,3,3,0,0,0,3,0,0,0,3,0,0,0,3,0	;7
	FCB	0,3,3,0,0,3,3,0,3,0,3,0,3,3,3,0	;8
	FCB	3,3,3,0,3,3,3,0,0,0,3,0,0,0,3,0	;9
	FCB	0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0	;:
	FCB	0,3,0,0,0,0,0,0,0,3,0,0,3,0,0,0	;
	FCB	0,0,3,0,3,3,0,0,3,3,0,0,0,0,3,0	;<
	FCB	3,3,3,0,0,0,0,0,3,3,3,0,0,0,0,0	;=
	FCB	3,0,0,0,0,3,3,0,0,3,3,0,3,0,0,0	;>
	FCB	3,3,0,0,0,0,3,0,0,3,0,0,0,2,0,0	;?
	FCB	0,3,3,0,3,3,3,0,3,3,3,0,0,0,3,0	;@
	FCB	3,3,3,0,3,0,3,0,3,3,3,0,3,0,3,0	;A
	FCB	3,3,0,0,3,3,3,0,3,0,3,0,3,3,3,0	;B
	FCB	0,3,3,0,3,0,0,0,3,0,0,0,0,3,3,0	;C
	FCB	3,3,0,0,3,0,3,0,3,0,3,0,3,3,0,0	;D
	FCB	3,3,3,0,3,0,0,0,3,2,0,0,3,3,3,0	;E
	FCB	3,3,3,0,3,0,0,0,3,3,0,0,3,0,0,0	;F
	FCB	3,3,3,0,3,0,0,0,3,0,3,0,3,3,3,0	;G
	FCB	3,0,3,0,3,3,3,0,3,0,3,0,3,0,3,0	;H
	FCB	3,3,3,0,0,3,0,0,0,3,0,0,3,3,3,0	;I
	FCB	0,0,3,0,0,0,3,0,3,0,3,0,3,3,3,0	;J
	FCB	3,0,3,0,3,3,0,0,3,0,3,0,3,0,3,0	;K
	FCB	3,0,0,0,3,0,0,0,3,0,0,0,3,3,3,0	;L
	FCB	2,0,2,0,3,2,3,0,3,2,3,0,3,2,3,0	;M
	FCB	3,3,3,0,3,0,3,0,3,0,3,0,3,0,3,0	;N
	FCB	3,3,3,0,3,0,3,0,3,0,3,0,3,3,3,0	;O
	FCB	3,3,3,0,3,0,3,0,3,3,3,0,3,0,0,0	;P
	FCB	3,3,3,0,3,0,3,0,3,2,3,0,3,3,2,0	;Q
	FCB	3,3,3,0,3,0,3,0,3,3,0,0,3,0,3,0	;R
	FCB	0,3,3,0,3,0,0,0,0,3,3,0,3,3,0,0	;S
	FCB	3,3,3,0,0,3,0,0,0,3,0,0,0,3,0,0	;T
	FCB	3,0,3,0,3,0,3,0,3,0,3,0,3,3,3,0	;U
	FCB	3,0,3,0,3,0,3,0,3,3,3,0,0,3,0,0	;V
	FCB	3,0,3,0,3,2,3,0,3,2,3,0,3,3,3,0	;W
	FCB	3,0,3,0,0,3,0,0,0,3,0,0,3,0,3,0	;X
	FCB	3,0,3,0,3,3,3,0,0,3,0,0,0,3,0,0	;Y
	FCB	3,3,3,0,0,3,3,0,3,3,0,0,3,3,3,0	;Z
	FCB	3,3,0,0,3,0,0,0,3,0,0,0,3,3,0,0	;[
	FCB	3,0,0,0,0,3,0,0,0,3,0,0,0,0,3,0	;\
	FCB	3,3,0,0,0,3,0,0,0,3,0,0,3,3,0,0	;]
	FCB	0,3,0,0,3,0,3,0,0,0,0,0,0,0,0,0	;^
	FCB	0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0	;_
	FCB	0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0	;`
; lowercase not supported
#MOVE
;
;
; U SHOULD BE SET
PRINT1	LDB	START1
	BEQ	NOMARQ
ADVU	LDA	,U+
	BEQ	EXITRR	;did we exit string?
	DECB
	BNE	ADVU
	BRA	NOMARQ
EXITRR	RTS
NOMARQ	STU	STRINGLOC	;save position
	LDX	#SCREENTBL
	LDB	SCREEN
	ABX
	ABX
	LDD	,X
	TFR	D,X	;ready
	LDA	YPOS
	LDB	#32
	MUL
	LEAX	D,X	;advance y down
	LDA	XPOS
	ANDA	#3
	STA	DOTSTR
	LDA	XPOS
	LSRA
	LSRA	;dev 4
	LEAX	A,X	;we are at byte start
	STX	CHRSTART
	INC	LEN1	;fix chr issue
; ok lets get next chr
NEXTCHR	LDU	STRINGLOC	;get next chr
	LDB	,U+
	STU	STRINGLOC	;save
	DEC	LEN1
	LDA	LEN1
	CMPA	#0
	BEQ	EXITRR	;EXIT
	CMPB	#0
	BNE	PROCESS1
	RTS	;done string
PROCESS1	CLRA	
	SUBB	#32
	LDU	#ASCII	;the table
	LDA	#16
	MUL
	LEAU	D,U	;ok we are ready
	LDB	#4
	LDY	#DOTS
; copy dots
COPYDTS	DECB	;sub 1
	LDA	0,X	;first byte
	ANDA	#192
	LSRA
	LSRA
	LSRA
	LSRA
	LSRA
	LSRA
	STA	0,Y
	LDA	0,X
	ANDA	#48
	LSRA
	LSRA
	LSRA
	LSRA	;4 times right
	STA	1,Y
	LDA	0,X
	ANDA	#12
	LSRA
	LSRA	;2 times right
	STA	2,Y
	LDA	0,X
	ANDA	#3
	STA	3,Y	;first byte preserved
	LDA	1,X	;second byte
	ANDA	#192
	LSRA
	LSRA
	LSRA
	LSRA
	LSRA
	LSRA
	STA	4,Y
	LDA	1,X
	ANDA	#48
	LSRA
	LSRA
	LSRA
	LSRA	;4 times right
	STA	5,Y
	LDA	1,X
	ANDA	#12
	LSRA
	LSRA	;2 times right
	STA	6,Y
	LDA	1,X
	ANDA	#3
	STA	7,Y	;second byte preserved
; ok lets add chr
; is transparency on?
	STB	TEMP
	LDA	TRANS
	BEQ	NOTRANS
; transparency yes
	LDB	DOTSTR
	LDA	0,U	;dot 1
	BEQ	NEXT0
	STA	B,Y
NEXT0	INCB
	LDA	1,U	;dot 2
	BEQ	NEXT1
	STA	B,Y
NEXT1	INCB
	LDA	2,U	;dot 3
	BEQ	NEXT2
	STA	B,Y
NEXT2	INCB
	LDA	3,U	;dot4
	BEQ	OKDRAW
	STA	B,Y
	BRA	OKDRAW
NOTRANS	LDB	DOTSTR
	LDA	0,U	;dot 1
	STA	B,Y
	LDA	1,U	;dot 2
	INCB
	STA	B,Y
	LDA	2,U	;dot 3
	INCB
	STA	B,Y
	LDA	3,U	;dot4
	INCB
	STA	B,Y
; ok draw the two bytes now
OKDRAW	LDA	0,Y	;draw first byte
	LSLA
	LSLA
	ADDA	1,Y
	LSLA
	LSLA
	ADDA	2,Y
	LSLA
	LSLA
	ADDA	3,Y
	STA	0,X
; second
	LDA	4,Y	;draw second byte
	LSLA
	LSLA
	ADDA	5,Y
	LSLA
	LSLA
	ADDA	6,Y
	LSLA
	LSLA
	ADDA	7,Y
	STA	1,X
; done
	LEAU	4,U	;advance next line
	LEAX	32,X	;next line
	LDB	TEMP
	LBNE	COPYDTS	;is b 0?
	LDX	CHRSTART
	LEAX	1,X	;advance one byte
	STX	CHRSTART
	LBRA	NEXTCHR
ENDFUNCTION
;
; ************************************************************************************************************************
; * pset1(screen, xpos, ypos, color)
; ************************************************************************************************************************
FUNCTION	PSET1	SCRN,XP1,YP1,COL1
REM	; pset1(screen 0-3, xpos, ypos, color) 0-127 x 0-63 x 0-3
REM	; pmode 1 display
DEF	SCRN	BYTE
DEF	XP1	BYTE
DEF	YP1	BYTE
DEF	COL1	BYTE
SCRNTBL	FDB	3584,5632,7680,9728
DOTMSK	FCB	63,207,243,252
DOTMSK2	FCB	192,48,12,3
DOTCOL	FCB	0,85,170,255
SCRN	FCB	0	; screen 0-3
XP1	FCB	9	; 0-127
YP1	FCB	56	; 0-63
COL1	FCB	2	; dot color 0-3
DOTST	FCB	0	; dot store
DOTM	FCB	0	; dot masked color
PSET1	LDA	XP1
	CMPA	#127
	BHI	DONE
	LDA	YP1
	CMPA	#63
	BHI	DONE
	LDB	SCRN
	LDX	#SCRNTBL
	LDY	#DOTMSK2
	LDU	#DOTCOL
	LSLB	; SCRN #*2
	ABX
	LDX	,X
; x index is at start of screen
	LDA	YP1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	XP1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	XP1
	LSRB
	LSRB
	ABX	;ok we are ready to draw (again, result is always 8 bits LCB)
; mask color
	LDB	COL1
	LDA	B,U
	LDB	DOTST
	ANDA	B,Y
	STA	DOTM	;dot saved
; grab original
	LDU	#DOTMSK	; 1 byte smaller/1 CYCLE FASTER
	LDA	,X
	ANDA	B,U
	ADDA	DOTM
	STA	,X
DONE	RTS
ENDFUNCTION
;
; ************************************************************************************************************************
; * point1(screen, xpos, ypos)
; ************************************************************************************************************************
FUNCTION	POINT1	SCRN,XP1,YP1
REM	; point1(screen 0-3, xpos, ypos) 0-127 x 0-63    returns color back to b register
REM	; returns color back to b register
DEF	SCRN	BYTE
DEF	XP1	BYTE
DEF	YP1	BYTE
SCRNTBL	FDB	3584,5632,7680,9728
SCRN	FCB	0	; screen 0-3
XP1	FCB	0	; 0-127
YP1	FCB	0	; 0-63
DOTST	FCB	0	; dot store
POINT1	LDA	SCRN
	LDX	#SCRNTBL
	LDB	#2
	MUL
	LEAX	B,X
	LDX	,X
; x index is at start of screen
	LDA	YP1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	XP1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	XP1
	LSRB
	LSRB
	LEAX	B,X	;ok we are ready to draw
	LDA	DOTST
	CMPA	#3
	BEQ	HOWB0
	CMPA	#2
	BEQ	HOWB1
	CMPA	#1
	BEQ	HOWB2
; its 4th dot
	LDB	,X
	LSRB
	LSRB
	LSRB
	LSRB
	LSRB
	LSRB
	ANDB	#3
	RTS
HOWB0	LDB	,X
	ANDB	#3
	RTS
HOWB1	LDB	,X
	LSRB
	LSRB
	ANDB	#3
	RTS
HOWB2	LDB	,X
	LSRB
	LSRB
	LSRB
	LSRB
	ANDB	#3
	RTS
ENDFUNCTION
;
; *************************************************************************************
; * line1(screen,x1,y1,x2,y2,col)
; *************************************************************************************
FUNCTION	LINE1	SCRN,X1,Y1,X2,Y2,COL1
REM	; line1( screen 0-3, x1,y1,x2,y2,color 0-3)
REM	; resolution x=0-127 y=0-63 color=0-3
DEF	SCRN	BYTE
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	X2	BYTE
DEF	Y2	BYTE
DEF	COL1	BYTE
XDIST	FCB	0
YDIST	FCB	0
WN	FCB	0	;whole fraction
XC	FCB	0	;direction control
YC	FCB	0
YCNT	FCB	0
XCNT	FCB	0
CNT	FCB	0
X1	FCB	0
Y1	FCB	0
X2	FCB	0
Y2	FCB	0
COL1	FCB	0
SCRNTBL	FDB	3584,5632,7680,9728
DOTMSK	FCB	63,207,243,252
DOTMSK2	FCB	192,48,12,3
DOTCOL	FCB	0,85,170,255
SCRN	FCB	0	; screen 0-3
DOTST	FCB	0	; dot store
DOTM	FCB	0	; dot masked color
LINE1	LDA	X1
	CMPA	X2
	BLS	LIND0
	LDA	X1
	SUBA	X2
	STA	XDIST
	CLR	XC	; direction x-
	BRA	LIND1
LIND0	LDA	X2
	SUBA	X1
	STA	XDIST
	LDA	#1
	STA	XC	; direction x+
LIND1	LDA	Y1
	CMPA	Y2
	BLS	LIND2
	LDA	Y1
	SUBA	Y2
	STA	YDIST
	CLR	YC	; direction y-
	BRA	LIND3
LIND2	LDA	Y2
	SUBA	Y1
	STA	YDIST
	LDA	#1
	STA	YC	; direction y+
; lets grab whole fraction
LIND3	LDA	XDIST
	CMPA	YDIST
	BLS	YISWN
	LDA	XDIST
	STA	WN	; x is the whole number
	BRA	DRAWLN
YISWN	LDA	YDIST
	STA	WN
; ok the distances are sorted
DRAWLN	LDA	WN
	LSRA
	STA	XCNT
	STA	YCNT
	LDA	WN
	STA	CNT	;set counter
	INC	CNT
DRAWLN1	JSR	DRAWDOT
	LDA	XCNT
	ADDA	XDIST
	CMPA	WN
	BHS	ADV2
	STA	XCNT
	BRA	CHK2
;
ADV2	SUBA	WN
	STA	XCNT
	LDA	XC	;the direction? 0 left 1 right
	BEQ	XLEFT
; right
	INC	X1
	BRA	CHK2
XLEFT	DEC	X1
CHK2	LDA	YCNT
	ADDA	YDIST
	CMPA	WN
	BHS	ADVY2
	STA	YCNT
	BRA	CHK3
ADVY2	SUBA	WN
	STA	YCNT
	LDA	YC	;the direction? 0 left 1 right
	BEQ	YLEFT
; right
	INC	Y1
	BRA	CHK3
YLEFT	DEC	Y1
CHK3	DEC	CNT
	BNE	DRAWLN1
NOPE	RTS
DRAWDOT	LDA	X1
	CMPA	#127
	BHI	NOPE
	LDA	Y1
	CMPA	#63
	BHI	NOPE
	LDB	SCRN
	LDX	#SCRNTBL
	LDY	#DOTMSK2
	LDU	#DOTCOL
	LSLB	; SCRN #*2
	ABX
	LDX	,X
; x index is at start of screen
	LDA	Y1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	X1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	X1
	LSRB
	LSRB
	ABX	;ok we are ready to draw (again, result is always 8 bits LCB)
; mask color
	LDB	COL1
	LDA	B,U
	LDB	DOTST
	ANDA	B,Y
	STA	DOTM	;dot saved
; grab original
	LDU	#DOTMSK	; 1 byte smaller/1 CYCLE FASTER
	LDA	,X
	ANDA	B,U
	ADDA	DOTM
	STA	,X
	RTS
ENDFUNCTION
;
;
; *************************************************************************************
; * line3d1(screen,x1,y1,x2,y2,col,wall)
; *************************************************************************************
FUNCTION	LINE3D1	SCRN,X1,Y1,X2,Y2,COL1,WALL
REM	; line3d1( screen 0-3, x1,y1,x2,y2,color 0-3,wall height)
REM	; resolution x=0-127 y=0-63 color=0-3
DEF	SCRN	BYTE
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	X2	BYTE
DEF	Y2	BYTE
DEF	COL1	BYTE
DEF	WALL	BYTE
XDIST	FCB	0
YDIST	FCB	0
WN	FCB	0	;whole fraction
XC	FCB	0	;direction control
YC	FCB	0
YCNT	FCB	0
XCNT	FCB	0
CNT	FCB	0
X1	FCB	0
Y1	FCB	0
X2	FCB	0
Y2	FCB	0
COL1	FCB	0
WALL	FCB	0
SCRNTBL	FDB	3584,5632,7680,9728
DOTMSK	FCB	63,207,243,252
DOTMSK2	FCB	192,48,12,3
DOTCOL	FCB	0,85,170,255
SCRN	FCB	0	; screen 0-3
DOTST	FCB	0	; dot store
DOTM	FCB	0	; dot masked color
LINE3D1	LDA	X1
	CMPA	X2
	BLS	LIND0
	LDA	X1
	SUBA	X2
	STA	XDIST
	CLR	XC	; direction x-
	BRA	LIND1
LIND0	LDA	X2
	SUBA	X1
	STA	XDIST
	LDA	#1
	STA	XC	; direction x+
LIND1	LDA	Y1
	CMPA	Y2
	BLS	LIND2
	LDA	Y1
	SUBA	Y2
	STA	YDIST
	CLR	YC	; direction y-
	BRA	LIND3
LIND2	LDA	Y2
	SUBA	Y1
	STA	YDIST
	LDA	#1
	STA	YC	; direction y+
; lets grab whole fraction
LIND3	LDA	XDIST
	CMPA	YDIST
	BLS	YISWN
	LDA	XDIST
	STA	WN	; x is the whole number
	BRA	DRAWLN
YISWN	LDA	YDIST
	STA	WN
; ok the distances are sorted
DRAWLN	LDA	WN
	LSRA
	STA	XCNT
	STA	YCNT
	LDA	WN
	STA	CNT	;set counter
	INC	CNT
DRAWLN1	JSR	DRAWDOT
	LDA	Y1
	PSHS	A
	SUBA	WALL
	STA	Y1
	JSR	DRAWDOT
	PULS	A
	STA	Y1
	LDA	XCNT
	ADDA	XDIST
	CMPA	WN
	BHS	ADV2
	STA	XCNT
	BRA	CHK2
;
ADV2	SUBA	WN
	STA	XCNT
	LDA	XC	;the direction? 0 left 1 right
	BEQ	XLEFT
; right
	INC	X1
	BRA	CHK2
XLEFT	DEC	X1
CHK2	LDA	YCNT
	ADDA	YDIST
	CMPA	WN
	BHS	ADVY2
	STA	YCNT
	BRA	CHK3
ADVY2	SUBA	WN
	STA	YCNT
	LDA	YC	;the direction? 0 left 1 right
	BEQ	YLEFT
; right
	INC	Y1
	BRA	CHK3
YLEFT	DEC	Y1
CHK3	DEC	CNT
	BNE	DRAWLN1
NOPE	RTS
DRAWDOT	LDA	X1
	CMPA	#127
	BHI	NOPE
	LDA	Y1
	CMPA	#63
	BHI	NOPE
	LDB	SCRN
	LDX	#SCRNTBL
	LDY	#DOTMSK2
	LDU	#DOTCOL
	LSLB	; SCRN #*2
	ABX
	LDX	,X
; x index is at start of screen
	LDA	Y1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	X1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	X1
	LSRB
	LSRB
	ABX	;ok we are ready to draw (again, result is always 8 bits LCB)
; mask color
	LDB	COL1
	LDA	B,U
	LDB	DOTST
	ANDA	B,Y
	STA	DOTM	;dot saved
; grab original
	LDU	#DOTMSK	; 1 byte smaller/1 CYCLE FASTER
	LDA	,X
	ANDA	B,U
	ADDA	DOTM
	STA	,X
	RTS
ENDFUNCTION
;
; **********************************************************************************************************************
; * circle1(screen,sin_costable,x1,y1,dx,dy,angle,dist,color)
; * 
; **********************************************************************************************************************
FUNCTION	CIRCLE1	SCRN,X,PLOTX,PLOTY,RADX,RADY,ANGLE,DIST,SETCOL
REM	; circle1(screen 0-3,[sintbl pointer],x1,y1,diamx,diamy,angle start,distance,col)
REM	; pmode 1  128x64x4   max rad 34 dist=0-255 full circle angle 0-255 as percentage of 360
DEF	SCRN	BYTE
DEF	X	STRING
DEF	ANGLE	BYTE
DEF	DIST	BYTE
DEF	PLOTX	BYTE
DEF	PLOTY	BYTE
DEF	RADX	BYTE
DEF	RADY	BYTE
DEF	SETCOL	BYTE
DIST	FCB	0
ANGLE	FCB	0
SETCOL	FCB	0
RADX	FCB	0	;radius
RADY	FCB	0
PLOTX	FCB	0
PLOTY	FCB	0
CNT	FCB	0	;counter from 0-255 to make circle
SINTB1	FCB	0,0
COSTB1	FCB	0,0
SCRNTBL	FDB	3584,5632,7680,9728
DOTMSK	FCB	63,207,243,252
DOTMSK2	FCB	192,48,12,3
DOTCOL	FCB	0,85,170,255
SCRN	FCB	0	; screen 0-3
XP1	FCB	9	; 0-127
YP1	FCB	56	; 0-63
DOTST	FCB	0	; dot store
DOTM	FCB	0	; dot masked color
CIRCLE1	STX	SINTB1
	LDB	ANGLE	;rotation
	ABX
	STX	SINTB1
	LDB	#64
	ABX
	STX	COSTB1
	CLR	CNT	;counter set
LOOP	LDX	SINTB1
	LDB	CNT
	ABX
	LDB	,X
	CMPB	#255
	BEQ	NOINCX
	INCB
NOINCX	LDA	RADX
	MUL
	ASLB
	ROLA
	SUBA	RADX
	ADDA	PLOTX
	STA	XP1
	LDB	CNT
	LDX	COSTB1
	ABX
	LDB	,X
	CMPB	#255
	BEQ	NOINCY
	INCB
NOINCY	LDA	RADY
	MUL
	ASLB
	ROLA
	SUBA	RADY
	ADDA	PLOTY
	STA	YP1
NOFILL	JSR	PSET
	LDA	CNT
	CMPA	DIST
	BEQ	EXITC
	CMPA	#255
	BEQ	EXITC
	INCA
	STA	CNT
	BRA	LOOP
EXITC	RTS
PSET	LDB	SCRN
	LDX	#SCRNTBL
	LDY	#DOTMSK2
	LDU	#DOTCOL
	LSLB	; SCRN #*2
	ABX
	LDX	,X
; x index is at start of screen
	LDA	YP1
	LDB	#32
	MUL
	LEAX	D,X	; advance y pos
	LDA	XP1
	ANDA	#3	;mask out which dot of 4
	STA	DOTST
	LDB	XP1
	LSRB
	LSRB
	ABX	;ok we are ready to draw (again, result is always 8 bits LCB)
; mask color
	LDB	SETCOL
	LDA	B,U
	LDB	DOTST
	ANDA	B,Y
	STA	DOTM	;dot saved
; grab original
	LDU	#DOTMSK	; 1 byte smaller/1 CYCLE FASTER
	LDA	,X
	ANDA	B,U
	ADDA	DOTM
	STA	,X
	RTS
ENDFUNCTION
;
;
; **********************************************************************************************************************
; * plot1(sin_costable,x1,y1,dx,dy,angle)
; * 
; **********************************************************************************************************************
FUNCTION	PLOT1	X,PLOTX,PLOTY,RADX,RADY,ANGLE
REM	; plot1([sintbl pointer],x1,y1,diamx,diamy,angle)   returns x,y on a,b
REM	; pmode 1  128x64x4   max rad 34 dist=0-255 full circle angle 0-255 as percentage of 360
DEF	X	STRING
DEF	ANGLE	BYTE
DEF	PLOTX	BYTE
DEF	PLOTY	BYTE
DEF	RADX	BYTE
DEF	RADY	BYTE
ANGLE	FCB	0
RADX	FCB	0	;radius
RADY	FCB	0
PLOTX	FCB	0
PLOTY	FCB	0
SINTB1	FCB	0,0
COSTB1	FCB	0,0
PLOT1	STX	SINTB1
	LDB	ANGLE	;rotation
	ABX
	STX	SINTB1
	LDB	#64
	ABX
	STX	COSTB1
; it begins
	LDX	SINTB1
	LDB	,X
	CMPB	#255
	BEQ	NOINCX
	INCB
NOINCX	LDA	RADX
	MUL
	ASLB
	ROLA
	SUBA	RADX
	ADDA	PLOTX
	STA	PLOTX
	LDX	COSTB1
	LDB	,X
	CMPB	#255
	BEQ	NOINCY
	INCB
NOINCY	LDA	RADY
	MUL
	ASLB
	ROLA
	SUBA	RADY
	ADDA	PLOTY
	STA	PLOTY
	LDD	PLOTX
	RTS	;a=x b=y
ENDFUNCTION
;
; 
; **********************************************************************************************************************
; * plot3d1(sin_table,cos_table,x1,y1,dx,dy,angle,flag)
; * 
; **********************************************************************************************************************
FUNCTION	PLOT3D1	X,Y,PLOTX,PLOTY,RADX,RADY,ANGLE,FLAG
REM	; plot3d1([sintbl pointer],[costbl pointer],x1,y1,diamx,diamy,angle,flag)   returns x,y on a,b    flag=0,1 top bot
REM	; pmode 1  128x64x4   max rad 34 dist=0-255 full circle angle 0-255 as percentage of 360
DEF	X	STRING
DEF	Y	STRING
DEF	ANGLE	BYTE
DEF	PLOTX	BYTE
DEF	PLOTY	BYTE
DEF	RADX	BYTE
DEF	RADY	BYTE
DEF	FLAG	BYTE
ANGLE	FCB	0
RADX	FCB	0	;radius
RADY	FCB	0
PLOTX	FCB	0
PLOTY	FCB	0
SINTB1	FCB	0,0
COSTB1	FCB	0,0
FLAG	FCB	0
PLOT3D1	STX	SINTB1
	STY	COSTB1
	LDB	ANGLE	;rotation
	ADDB	#128
	ABX
	STX	SINTB1
	LDB	ANGLE
	LDX	COSTB1
	LDA	FLAG
	BEQ	NORM1
	ADDB	#128	;flip it
NORM1	ABX
	STX	COSTB1
; it begins
	LDX	SINTB1
	LDB	,X
	CMPB	#255
	BEQ	NOINCX
	INCB
NOINCX	LDA	RADX
	MUL
	ASLB
	ROLA
	SUBA	RADX
	ADDA	PLOTX
	STA	PLOTX
	LDX	COSTB1
	LDB	,X
	CMPB	#255
	BEQ	NOINCY
	INCB
NOINCY	LDA	RADY
	MUL
	ASLB
	ROLA
	SUBA	RADY
	ADDA	PLOTY
	STA	PLOTY
	LDD	PLOTX
	RTS	;a=x b=y
ENDFUNCTION
;
